// 对象类型 object {}
let a: object
a = function () {

}
a = {}

// 对象类型约束
// ? 类型声明时, 表示可选属性
let b: { name: string, c?: number }
// b = {}
// b = {name: 123}
// 带可选属性, 两种赋值都对
b = {name: 'xyx', c: 123}
b = {name: 'abc'}

// 必须有 name, [属性名: 字符串属性名], 其它任意属性还可以有多个
let c: { name: string, [propName: string]: any }
c = {name: 'ooo'}
c = {name: 'kkk', a: 1, b: 2}

// 函数, 限制函数参数, 返回值的类型
// let d: Function => let d: object
let d: (a: number, b: number) => number
// d = function(a, b, c) { return a + b} 不符合d的类型约束
d = function (a, b) {
    return a + b
}

// 数组, 类型约束
let e: string[]
// e = ['1', 'b', 3]
e = ['1', 'b', '3']

let f:number[]
// 约束 string 类型数组
let g: Array<string>

// 元祖 tuple 固定长度的数组
let h: [string, number]
// h = ['abc']
h = ['abc', 123] // 固定长度和类型

// 枚举 enum  key-value 不可修改的值
// 增强了可读性
enum Gender {
    Female,
    Male
}

let i:{name: string, gender: Gender}
i = {name: 'rose', gender: Gender.Male}
console.log(i)

// 或者, 并且, 类型别名
// | & type
let j: {name: string} & {age: number}
// j = {name: 'rose'}
j = {name: 'rose', age: 30}

let k: 1 | 2 | 3 | 4 | 5
let l: 1 | 2 | 3 | 4 | 5

type num = 1 | 2 | 3 | 4 | 5  // 类型别名, 定义

let m:num
// m =6
m = 4

